'use strict';

var watchify = require('watchify');
var browserify = require('browserify');
var browserifyShim = require("browserify-shim");
var gulp = require('gulp');
var source = require('vinyl-source-stream');
var buffer = require('vinyl-buffer');
var gutil = require('gulp-util');
var sourcemaps = require('gulp-sourcemaps');
var assign = require('lodash.assign');
var rename = require('gulp-rename');
var uglify = require('gulp-uglify');
var glob = require('glob');
var es = require('event-stream');
var html2js_browserify = require('html2js-browserify');
var concat = require('gulp-concat');
var clean = require('gulp-clean');


/*********************************以下多个入口文件***************************************************************************/

gulp.task('js-task', function(done) {
    glob('app/controllers/*.js', function(err, files) {
        if (err) {
            console.log(err);
            done(err)
            return;
        }
        var tasks = files.map(function(entry) {
            var newEntry = entry.toString().replace('app/controllers/', '').replace('Controller', '');
            var customOpts = {
                entries: [entry],
                debug: true
            };
            var opts = assign({}, watchify.args, customOpts);
            var b = watchify(browserify(opts));
            return b
                // .transform(browserifyShim, {
                //     shim: {
                //         "jquery": "global:jQuery",
                //         "knockout": "ko",
                //         "pjax": {
                //             "depends": ["jquery"]
                //         },
                //         "underscore": "_",
                //     }
                // })
                .transform(html2js_browserify)
                .bundle()
                .on('error', gutil.log.bind(gutil, 'Browserify Error'))
                .pipe(source(newEntry))
                .pipe(rename({
                    extname: '.min.js'
                }))
                .pipe(buffer())
                .pipe(uglify())
                .pipe(gulp.dest('./dist'));
            // return browserify({
            //         entries: [entry]
            //     })
            //     .transform(browserifyShim,{
            //        shim:{
            //            jquery:"global:jQuery"
            //        }
            //     })
            //     .bundle()
            //     .pipe(source(newEntry))
            //     .pipe(rename({
            //         extname: '.min.js'
            //     }))
            //     .pipe(buffer())
            //     .pipe(uglify())
            //     .pipe(gulp.dest('./dist'));
        });
        es.merge(tasks).on('end', done);
    })
});


gulp.task('js-watch', function() {
    var watcher = gulp.watch('app/controllers/*.js', ['js-task']);
    watcher.on('change', function(event) {
        console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
    });
});

//gulp.task('default', ['js-task']);

gulp.task('jquery-task', function() {
    return gulp.src('./app/vendor/jquery.*.js')
        .pipe(concat('jquery.js'))
        .pipe(gulp.dest('./dist/all'))
        .pipe(rename({
            suffix: '.min'
        }))
        //.pipe(uglify())
        .pipe(gulp.dest('./dist'));
});

gulp.task('public-task', function() {
    return gulp.src('./app/vendor/public/*.js')
        .pipe(concat('vendor.js'))
        .pipe(gulp.dest('./dist/all'))
        .pipe(rename({
            suffix: '.min'
        }))
        //.pipe(uglify())
        .pipe(gulp.dest('./dist'));
});

gulp.task('clear-task', function() {
    gulp.src('./dist/all', {
            read: false
        })
        .pipe(clean());
});


gulp.task('default', ['jquery-task', 'public-task'], function() {
    gulp.start('js-task', 'js-watch', 'clear-task');
});

/***********************************************以下为单个入口文件******************************************************/
// 在这里添加自定义 browserify 选项
// var customOpts = {
//     entries: ['app/controllers/indexController.js'],
//     debug: true
// };
//var opts = assign({}, watchify.args, customOpts);
//var b = watchify(browserify(opts));

// 在这里加入变换操作
// 比如： b.transform(coffeeify);

//gulp.task('js', bundle); // 这样你就可以运行 `gulp js` 来编译文件了
//b.on('update', bundle); // 当任何依赖发生改变的时候，运行打包工具
//b.on('log', gutil.log); // 输出编译日志到终端


// function bundle() {
//     return b.bundle()
//         // 如果有错误发生，记录这些错误
//         .on('error', gutil.log.bind(gutil, 'Browserify Error'))
//         .pipe(source('index.js'))
//         // 可选项，如果你不需要缓存文件内容，就删除
//         .pipe(buffer())
//         // 可选项，如果你不需要 sourcemaps，就删除
//         //.pipe(sourcemaps.init({loadMaps: true})) // 从 browserify 文件载入 map
//         // 在这里将变换操作加入管道
//         //.pipe(sourcemaps.write('./')) // 写入 .map 文件
//         //.pipe(gulp.dest('./dist'));
//         //.pipe(rename('*.min.js'))
//         .pipe(uglify())
//         .pipe(gulp.dest('./dist'));
// }
